Qu'est-ce que la programmation fonctionnelle ? C'est un paradigme qui traite le calcul comme l'évaluation de fonctions mathématiques, sans état mutable ni effets de bord. Python supporte plusieurs concepts fonctionnels.
1. Fonctions Lambda (Fonctions Anonymes)
Les fonctions lambda sont des fonctions sans nom, idéales pour des opérations simples et courtes.
def carre_classique(x):
return x ** 2
carre_lambda = lambda x: x ** 2
print(carre_lambda(5))
somme = lambda a, b: a + b
print(somme(10, 3))
resultat = (lambda x, y: x * y)(4, 7)
print(resultat)
2. La fonction map()
map() applique une fonction à chaque élément d'un itérable et retourne un itérateur.
nombres = [1, 2, 3, 4, 5]
def double(x):
return x * 2
doubles = list(map(double, nombres))
print(doubles)
triples = list(map(lambda x: x * 3, nombres))
print(triples)
a = [1, 2, 3]
b = [10, 20, 30]
somme_listes = list(map(lambda x, y: x + y, a, b))
print(somme_listes)
3. La fonction filter()
filter() filtre les éléments d'un itérable selon une fonction de prédicat (qui retourne True ou False).
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pairs = list(filter(lambda x: x % 2 == 0, nombres))
print("Nombres pairs:", pairs)
mots = ["chat", "python", "le", "programmation", "est"]
mots_long = list(filter(lambda mot: len(mot) > 3, mots))
print("Mots > 3 caractères:", mots_long)
valeurs = [0, 1, False, "hello", None, "", 42]
valides = list(filter(None, valeurs))
print("Valeurs truthy:", valides)
4. La fonction reduce()
reduce() applique une fonction cumulativement aux éléments d'un itérable pour le réduire à une seule valeur. (Module functools)
from functools import reduce
nombres = [1, 2, 3, 4, 5]
produit = reduce(lambda x, y: x * y, nombres)
print("Produit:", produit)
maximum = reduce(lambda x, y: x if x > y else y, nombres)
print("Maximum:", maximum)
mots = ["Python", "est", "puissant"]
phrase = reduce(lambda a, b: a + " " + b, mots)
print("Phrase:", phrase)
somme = reduce(lambda x, y: x + y, nombres, 100)
print("Somme + 100:", somme)
5. Listes en Compréhension (List Comprehensions)
Les listes en compréhension sont une façon élégante et pythonique de créer des listes.
carres = [x**2 for x in range(1, 11)]
print("Carrés:", carres)
pairs = [x for x in range(20) if x % 2 == 0]
print("Pairs:", pairs)
temperatures_c = [0, 20, 30, 100]
temperatures_f = [(c * 9/5) + 32 for c in temperatures_c]
print("°F:", temperatures_f)
coordonnees = [(x, y) for x in range(3) for y in range(3)]
print("Coordonnées:", coordonnees)
Comparaison : map vs compréhension
map(lambda x: x*2, liste) → [x*2 for x in liste]
Les compréhensions sont souvent plus lisibles et plus "pythoniques".
6. Autres compréhensions (Dictionnaires, Ensembles)
carres_dict = {x: x**2 for x in range(1, 6)}
print("Dict carrés:", carres_dict)
original = {"a": 1, "b": 2, "c": 3}
inverse = {v: k for k, v in original.items()}
print("Inverse:", inverse)
nombres = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = {x for x in nombres}
print("Valeurs uniques:", unique)
lettres = {c for c in "programmation"}
print("Lettres uniques:", lettres)
7. Fonctions map, filter et compréhensions comparées
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
resultat1 = list(map(lambda x: x**2, filter(lambda x: x % 2 == 0, nombres)))
print("Avec map+filter:", resultat1)
resultat2 = [x**2 for x in nombres if x % 2 == 0]
print("Avec compréhension:", resultat2)
Bonnes pratiques :
- Préférez les compréhensions pour des transformations simples
- Utilisez
map() et filter() avec des fonctions déjà définies
- Évitez les lambdas trop complexes (préférez une fonction nommée)
reduce() est moins courant - parfois une boucle est plus claire